/*
4 5
1 2 3 4
0 2 1
2 3 1
3 1 2
2 1 4
0 3 5
4
2 0 2
0 1 2
0 1 3
0 1 4
*/
/*
Floyd算法 中转的本质思想
*/
#include<bits/stdc++.h>
using namespace std;
const int N=205;

int n,m;
int live[N];
int edges[N][N];

void update(int now)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(edges[i][now]+edges[now][j]<edges[i][j])
            {
                edges[i][j]=edges[j][i]=edges[i][now]+edges[now][j];
            }
        }
    }
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&live[i]);
    }
    for(int i=0;i<n;i++)
    {
        edges[i][i]=0;
        for(int j=i+1;j<n;j++)
        {
            edges[i][j]=edges[j][i]=1e9;
        }
    }
    for(int i=0;i<m;i++)
    {
        int s,t,w;
        scanf("%d%d%d",&s,&t,&w);
        edges[s][t]=edges[t][s]=w;
    }
    int now=0;
    int q;
    scanf("%d",&q);
    for(int i=0;i<q;i++)
    {
        int s,t,ti;
        scanf("%d%d%d",&s,&t,&ti);
        while(now<n&&live[now]<=ti)
        {
            update(now);
            now++;
        }
        if(ti<live[s]||ti<live[t]){
            printf("-1\n");
        }
        else if(edges[s][t]>=2*1e7){
            printf("-1\n");
        }
        else{
            printf("%d\n",edges[s][t]);
        }
    }
    return 0;
}